// 1200. [移位操作]路由表最长匹配
// https://oj.rnd.huawei.com/problems/1200/details
// 注意优先级 if ( ((uIp >> (32 - mask)) ^ (uIpDst >> (32 - mask))) == 0 || xx)
//路由表最长匹配是IP(v4) 路由器的最基本的功能之一：当路由器收到一个IP数据包时，
//会将数据包的目的IP地址与本地路由表进行匹配：
//格式：目的IP地址为dstIP，路由表中每条路由为entryIP/掩码长度m，如 10.166.50.0/23。
//注：所有IP地址以点分十进制字符串表示。
//匹配规则：如果 entryIP 和 dstIP 的二进制表示的前 m
//个bit相同，则说明该条路由是匹配的。
//注：10.166.50.0的二进制表示如下：0.0.0.0/0是默认路由，它与任何目的IP地址都是匹配的，m
//值为 0 。 所有匹配的路由中，m
//最大的即为“最长匹配”。现给出目的IP地址和本地路由表，请输出最长匹配的路由；
//如果有多条，则按给出的先后顺序输出最先的；如果没有匹配的，输出字符串empty。
//输入 第一行是目的IP地址，点分十进制表示的字符串。
//第二行一个整数 n，表示路由表中的路由数量，取值范围为 [1, 10000]。
//接下来 n 行表示 n 条路由，其中掩码长度 m 的取值范围为[0, 32]，m 值为 0
//仅存在于路由 0.0.0.0/0 。 输出
//最长匹配的路由，格式同输入；如果没有则输出字符串empty。 输入 192.168.0.3
// 6
// 10.166.50.0/23
// 192.0.0.0/8
// 10.255.255.255/32
// 192.168.0.1/24
// 127.0.0.0/8
// 192.168.0.0/24
//输出 192.168.0.1/24
//匹配的路由如下图所示，先按匹配的长度，再按输入先后顺序，结果为192.168.0.1/24
//输入 202.96.96.68
// 1
// 200.18.24.0/24
//输出 empty
//输入 10.110.32.77
// 2
// 127.0.0.1/8
// 0.0.0.0/0
//输出 0.0.0.0/0
// 127.0.0.1/8 不匹配； 0.0.0.0/0 是默认路由，是匹配的，且是唯一匹配的。
//注：可以用十进制数掩码长度来简单表示一个子网掩码，掩码长度指的是二进制子网掩码中连续1的个数，
//例如掩码长度 24 表示子网掩码的二进制形式为11111111.11111111.11111111.00000000
//十进制形式为：255.255.255.0； 长度24不包括分隔符点，掩码长度 27
//表示子网掩码的二进制形式为11111111.11111111.11111111.11100000（十进制形式为255.255.255.224）

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

//#define DEBUG
#ifdef DEBUG
#define PF(...) printf(__VA_ARGS__)
#else
#define PF(...)
#endif

class Solution {
 public:
  // 待实现函数，在此函数中填入答题代码;
  struct IpInfo {
    int id;
    unsigned int uIp;
    int mask;
  };
  string RouterSearch(const string &dstIp, const vector<string> &ipTable) {
    unsigned int uIpDst = 0;
    {
      int a1, a2, a3, a4, mk = 0;
      sscanf(dstIp.c_str(), "%d.%d.%d.%d/%d", &a1, &a2, &a3, &a4, &mk);
      uIpDst = (a1 << 24) + (a2 << 16) + (a3 << 8) + a4;
    }
    string result;
    vector<IpInfo> vtIp;
    int i = 0;
    for (auto ip : ipTable) {
      int a1, a2, a3, a4, mk = 0;
      sscanf(ip.c_str(), "%d.%d.%d.%d/%d", &a1, &a2, &a3, &a4, &mk);
      unsigned int uIp = (a1 << 24) + (a2 << 16) + (a3 << 8) + a4;
      vtIp.push_back({i, uIp, mk});
      i++;
    }
    std::sort(vtIp.begin(), vtIp.end(), [](IpInfo p1, IpInfo p2) {
      if (p1.mask == p2.mask) return p1.id < p2.id;
      return p1.mask > p2.mask;
    });
    int index = -1;
    for (auto [id, uIp, mask] : vtIp) {
      PF("%x,%x,   %x,%x\n", uIp, uIpDst, (uIp >> (32 - mask)),
         (uIpDst >> (32 - mask)));
      if (((uIp >> (32 - mask)) ^ (uIpDst >> (32 - mask))) == 0 ||
          (uIp == 0 && mask == 0)) {
        index = id;
        PF("find %d\n", id);
        break;
      }
    }
    result = "empty";
    if (index >= 0) {
      return result = ipTable[index];
    }

    return result;
  }
};

inline string ReadLine() {
  string line;
  getline(cin, line);
  return line;
}

inline vector<string> ReadLines(int size) {
  vector<string> lines(size);
  for (int i = 0; i < size; ++i) {
    lines[i] = ReadLine();
  }
  return lines;
}

inline vector<string> ReadCountedLines() {
  string numberLine = ReadLine();
  int count = stoi(numberLine);
  return ReadLines(count);
}

int main() {
  int a = 0x2;
  int b = 0x2;
  int c = 0x6;
  PF("%d\n", a ^ b);
  PF("%d\n", a ^ c);
  //    return 0;
  string dstIp = ReadLine();
  vector<string> ipTable = ReadCountedLines();

  Solution solu;
  string result = solu.RouterSearch(dstIp, ipTable);
  cout << result << endl;

  return 0;
}
